<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			// $.ajax()
			
			function ajax(options,callback){
				let xhr = null;
				// 创建xhr对象
				// var xhr = new XMLHttpRequest()
				// ie创建xhr，new ActiveXObject('Microsoft.XMLHTTP')//兼容IE5,IE6
				if(XMLHttpRequest){
					xhr = new XMLHttpRequest()
				}else{
					xhr = new ActiveXObject('Microsoft.XMLHTTP')
				}
				
				// 设置路径和方法
				xhr.open(options.method,options.url)
				// 设置数据，并且发送,一般post/put
				xhr.send(options.data)
				// 监听请求状态，执行对应的回调函数
				xhr.onreadystatechange = function(){
					if(xhr.readyState == 4 && xhr.status == 200){
						callback(xhr.response)
					}else if(xhr.readyState == 4 && xhr.status !==200){
						callback(new Error('请求失败'))
					}
				}
			}
			
			let httpUrl = 'https://getman.cn/mock/laochen/demo'
			ajax({url:httpUrl,method:"get"},function(res){
				console.log(res)
			})
			
			
			function lcAxios(url){
				return new LcPromise(function(resolve,reject){
					let xhr = null;
					// 创建xhr对象
					// var xhr = new XMLHttpRequest()
					// ie创建xhr，new ActiveXObject('Microsoft.XMLHTTP')//兼容IE5,IE6
					let options = {
						method:"get",
						url
					}
					if(XMLHttpRequest){
						xhr = new XMLHttpRequest()
					}else{
						xhr = new ActiveXObject('Microsoft.XMLHTTP')
					}
					
					// 设置路径和方法
					xhr.open(options.method,options.url)
					// 设置数据，并且发送,一般post/put
					xhr.send(options.data)
					// 监听请求状态，执行对应的回调函数
					xhr.onreadystatechange = function(){
						if(xhr.readyState == 4 && xhr.status == 200){
							// callback(xhr.response)
							resolve(xhr.response)
						}else if(xhr.readyState == 4 && xhr.status !==200){
							// callback(new Error('请求失败'))
							// reject(new Error('请求失败'))
							console.log(new Error('请求失败'))
						}
					}
				})
			}
			
			
			
			
			// function LcPromise(){
				
			// }
			
			class LcPromise{
				// 传入的函数会立即执行
				constructor(fn){
					// 存放拿到数据对应的.then里面的回调函数
					this.callbacks = [];
					// 设定状态
					this.state = 'pending' //fulfilled,rejected
					fn(this._resolve.bind(this))
				}
				// 要能接收成功之后的值
				_resolve(value){
					setTimeout(()=>{
						// resolve函数里面的this指向，绑定 为当前的promise对象
						this.state = 'fulfilled'
						this.callbacks.forEach(successFn=>successFn(value))
					},0)
					
				}
				// 调用then函数，实际将回调函数放入到callback数组里
				then(successFn){
					this.callbacks.push(successFn)
					return this
				}
			}
			
			
			// let p1 = lcAxios(httpUrl)
			// p1.then((res)=>{
			// 	console.log(res)
			// }).then((res)=>{
			// 	console.log(res)
			// })
			
			
			// let p = new Promise(function(resolve){
			// 	resolve("同步执行")
			// })
			let p = new LcPromise(function(resolve){
				resolve("同步执行")
			})
			p.then(function(res){
				console.log(res)
			})
		</script>
	</body>
</html>
